﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Data;
using System.Transactions;
using System.ComponentModel;
using UtilityExtensions;

namespace BOL
{
    [Serializable]
    public class EmpleadoBL
    {
        //public int add( dbGestionDataContext _db ,
        //                string descripcion,
        //                string nombre,
        //                string atte,
        //                string apePaterno,
        //                string apeMaterno,
        //                string dni,
        //                string usuario,
        //                string password,
        //                string telefono,
        //                string fax,
        //                string email,
        //                bool inActivo,
        //                bool tieneAcceso,
        //                List<EmpleadoObraItemInfo> ObrasAsignadas,
        //                List<EmpleadoProyInfo> ProyectoAsignadas,
        //                bool bitNotificacion)
        //{

        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

        //        string passwordplant = String.Empty;
        //        if (tieneAcceso)
        //        {
        //            RijndaelSimple login = new RijndaelSimple();
        //            passwordplant = login.EncryptarPassword(password);
        //        }

        //        Empleado empleado = new Empleado();
        //        empleado.add(_db,
        //            descripcion,
        //            nombre,
        //            atte,
        //            apePaterno,
        //            apeMaterno,
        //            dni,
        //            usuario,
        //            passwordplant,
        //            telefono,
        //            fax,
        //            email,
        //            inActivo,
        //            tieneAcceso, idUsuario,"");


        //        ///valores por default
        //        empleado.setUpdateAccesoModulo(false, 
        //                                        false, 
        //                                        false);

        //        empleado.setUpdateAprobarOC(false, 
        //                                    0);
                

        //        //no debe ingresar obras y rol del empleado repetido
        //        //var e = from a in  ObrasAsignadas
        //        //        where a.
        //        var clon = ObrasAsignadas;

        //        foreach (var a in ObrasAsignadas)
        //        {
        //            if (a.idInternal == 0)
        //            {
        //                continue;
        //            }
        //            if (clon.Where(p => p.idObra == a.idObra).Count() > 1)
        //            {
        //                //verificamos  que no repita las obras
        //                var rep = clon.Where(p => p.idObra == a.idObra);
        //                if (rep.Where(p => p.idRol == a.idRol).Count() > 1)
        //                {

        //                    throw new Exception("no debe de  ingresar  Obras duplicados y roles duplicados");
        //                }
        //            }

        //            EmpleadoObra erol = new EmpleadoObra();
        //            erol.idEmpleado = empleado.idInternal;
        //            erol.idObra = a.idObra;
        //            erol.idRol = a.idRol;
        //             _db.EmpleadoObras.InsertOnSubmit(erol);
        //        }




        //        var clon2 = ProyectoAsignadas;
        //        foreach (var a in ProyectoAsignadas)
        //        {
        //            if (a.idInternal == 0)
        //            {
        //                continue;
        //            }
        //            if (clon2.Where(p => p.idProyecto == a.idProyecto).Count() > 1)
        //            {
        //                //verificamos  que no repita las proyectos
        //                var rep = clon2.Where(p => p.idProyecto == a.idProyecto);
        //                if (rep.Where(p => p.idRol == a.idRol).Count() > 1)
        //                {

        //                    throw new Exception("no debe de  ingresar  proyectos duplicados");
        //                }
        //            }

        //            EmpleadoProy erol = new EmpleadoProy();
        //            erol.SetAdd(_db,
        //                         empleado.idInternal,
        //                         a.idRol,
        //                          a.idProyecto);
                    
        //        }


        //        if (bitNotificacion)
        //        {
        //            //para los casos envio de correo por nuevo password generado
        //            //correo personal
        //        }

        //        _db.SubmitChanges();
        //        ts.Complete();
        //        return empleado.idInternal;
        //    }
        //}

        public int AddEmpleadoObra(dbGestionDataContext _db, int idEmpleado,int idObra,int idRol)
        {

            using (TransactionScope ts = new TransactionScope())
            {
                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado modificador = _db.Empleados.Single(p => p.idInternal == idUsuario);
             
                EmpleadoObra erol = new EmpleadoObra();
                erol.SetAdd(_db, idEmpleado, idObra, idRol, idUsuario);
                _db.SubmitChanges();
                ts.Complete();
                return erol.idInternal;
            }
        }

        public int AddEmpleadoProyecto(dbGestionDataContext _db, int idEmpleado, int idProyecto,int idRol)
        {

            using (TransactionScope ts = new TransactionScope())
            {
                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado modificador = _db.Empleados.Single(p => p.idInternal == idUsuario);

                EmpleadoProy erol = new EmpleadoProy();
                erol.SetAdd(_db, idEmpleado, idRol,idProyecto, idUsuario,modificador.usuario);
                _db.SubmitChanges();
                ts.Complete();
                return erol.idinternal;
            }
        }

        public void UpdateEmpleadoProyecto(dbGestionDataContext _db, int idInternal, int idRol)
        {

            using (TransactionScope ts = new TransactionScope())
            {
                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado modificador = _db.Empleados.Single(p => p.idInternal == idUsuario);

                EmpleadoProy eobra = _db.EmpleadoProys.Single(p => p.idinternal == idInternal);

                eobra.SetUpdate(idRol, idUsuario, modificador.usuario);

                _db.SubmitChanges();
                ts.Complete();

            }
        }

        public void UpdateEmpleadoObra(dbGestionDataContext _db, int idEmpleadoObra,  int idRol)
        {

            using (TransactionScope ts = new TransactionScope())
            {
                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado modificador = _db.Empleados.Single(p => p.idInternal == idUsuario);

                EmpleadoObra eobra = _db.EmpleadoObras.Single(p=>p.idInternal==idEmpleadoObra);

                eobra.SetUpdate(idRol,  idUsuario);

                _db.SubmitChanges();
                ts.Complete();
                
            }
        }

        public void DeleteEmpleadoObra(dbGestionDataContext _db, int idEmpleadoObra)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
                EmpleadoObra eobra = _db.EmpleadoObras.Single(p => p.idInternal == idEmpleadoObra);

                _db.EmpleadoObras.DeleteOnSubmit(eobra);

                _db.SubmitChanges();
                ts.Complete();

            }
        }

        public void DeleteEmpleadoProyecto(dbGestionDataContext _db, int idEmpleadoProyecto)
        {
            using (TransactionScope ts = new TransactionScope())
            {
                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                EmpleadoProy eobra = _db.EmpleadoProys.Single(p => p.idinternal == idEmpleadoProyecto);

                _db.EmpleadoProys.DeleteOnSubmit(eobra);

                _db.SubmitChanges();
                ts.Complete();

            }
        }

        public int add(dbGestionDataContext _db,
                        string descripcion,
                        string nombre,
                        string atte,
                        string apePaterno,
                        string apeMaterno,
                        string dni,
                        string telefono,
                        string fax,
                        string email,
                        string direccion,
                        bool inActivo,
                         bool tieneAcceso,
                        
                        bool bitCompraCHK,
                        bool bitVentaCHK,
                        bool bitAlmacenCHK,
                        decimal totalOC,
                        int idMoneda,
                        string usuario,
                        string password)
        {

            

            using (TransactionScope ts = new TransactionScope())
            {

                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado modificador = _db.Empleados.Single(p => p.idInternal == idUsuario);
                string passwordplant = String.Empty;
                
                Empleado empleado = new Empleado();
                empleado.add(_db,
                            descripcion,
                            nombre,
                            atte,
                            apePaterno,
                            apeMaterno,
                            dni,
                            telefono,
                            fax,
                            email,
                            inActivo,
                            idUsuario,direccion, modificador.usuario);


               
                if (tieneAcceso)
                {
                    if (password.Trim().Length == 0)
                    {
                        throw new Exception("verifique Password");
                    }

                    RijndaelSimple login = new RijndaelSimple();
                    passwordplant = login.EncryptarPassword(password);
                     empleado.setUpdateUsuario(usuario, passwordplant, tieneAcceso, false);
                }
                else
                {
                       empleado.setUpdateUsuario("", "", false, false);
                }
   
                empleado.setUpdateAccesoModulo(bitAlmacenCHK, bitCompraCHK, bitVentaCHK);
                if  (totalOC!=0)
                {
                    empleado.setUpdateAprobarOC(true, totalOC,idMoneda);
                }
                else
                {
                    empleado.setUpdateAprobarOC(false, 0, idMoneda);
                }
                
                _db.SubmitChanges();
                ts.Complete();
                return empleado.idInternal;
            }
        }


        public void update(dbGestionDataContext _db,
                        int idEmpleado,
                        string descripcion,
                        string nombre,
                        string atte,
                        string apePaterno,
                        string apeMaterno,
                        string dni,
                        string telefono,
                        string fax,
                        string email,
                        string direccion,
                        bool inActivo,

                        bool tieneAcceso,
                        bool bitCompraCHK,
                        bool bitVentaCHK,
                        bool bitAlmacenCHK,
                        decimal totalOC,
                        int idMoneda,
                        string usuario,
                        string password)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                int idUsuario = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                Empleado modificador=_db.Empleados.Single(p => p.idInternal == idUsuario);

                Empleado emp = _db.Empleados.Single(p => p.idInternal == idEmpleado);

                string passwordplant = String.Empty;
                RijndaelSimple login = new RijndaelSimple();


                emp.update(descripcion,
                        nombre,
                        atte,
                        apePaterno,
                        apeMaterno,
                        dni,
                        telefono,
                        fax,
                        email,
                        inActivo,
                        idUsuario,
                        direccion,
                        modificador.usuario);

                _db.SubmitChanges();
                passwordplant = emp.password;

                if (tieneAcceso)
                {
                    if (password.Trim().Length > 0)
                    {
                        passwordplant = login.EncryptarPassword(password);
                        
                    }
      
                }
                emp.setUpdateUsuario(usuario, passwordplant, tieneAcceso, emp.bitAdmin);

                emp.setUpdateAccesoModulo(bitAlmacenCHK, bitCompraCHK, bitVentaCHK);
                if (totalOC != 0)
                {
                    emp.setUpdateAprobarOC(true, totalOC,idMoneda);
                }
                else
                {
                    emp.setUpdateAprobarOC(false, 0,idMoneda);
                }

                _db.SubmitChanges();
                ts.Complete();
                
                
            }
        }


        //public bool update(dbGestionDataContext _db,
        //                int idEmpleado,
        //                string descripcion,
        //                string nombre,
        //                string atte,
        //                string apePaterno,
        //                string apeMaterno,
        //                string dni,
        //                string usuario,
        //                string password,
        //                string telefono,
        //                string fax,
        //                string email,
        //                bool inActivo,
        //                bool tieneAcceso,
        //                int usuarioMod,
        //                string FirmaEmpleado,
        //                DataSet EmpleadoCol)
        //{
        //    using(TransactionScope ts= new TransactionScope())
        //    {

                
        //            Empleado emp = _db.Empleados.Single(p => p.idInternal == idEmpleado);

        //            string passwordplant = String.Empty;
        //            RijndaelSimple login = new RijndaelSimple();

        //            if (tieneAcceso)
        //            {
        //                if (password == string.Empty)
        //                {
        //                    // se utiliza el password anterior
        //                    passwordplant = emp.password;
        //                }
        //                else
        //                {
        //                    // verificamos si existe ya un password
        //                    passwordplant = login.EncryptarPassword(password);

        //                }
        //            }
        //            string firma = emp.firma;
        //            if (FirmaEmpleado != String.Empty)
        //            {
        //                firma = FirmaEmpleado;
        //            }

        //            emp.update(_db,
        //                    descripcion,
        //                    nombre,
        //                    atte,
        //                    apePaterno,
        //                    apeMaterno,
        //                    dni,
        //                    usuario,
        //                    telefono,
        //                    fax,
        //                    email,
        //                    inActivo,
        //                    tieneAcceso,
        //                    passwordplant,
        //                    firma);

                  
                  

        //            _db.SubmitChanges();

        //            DataSet dsDiferencias = new DataSet();
        //            string STR_EmpleadoObraItemInfo = "EmpleadoObraItemInfo";
        //            string STR_EmpleadoProyInfo = "EmpleadoProyInfo";
                    

        //            if (EmpleadoCol.HasChanges())
        //            {
        //                dsDiferencias.Merge(EmpleadoCol.GetChanges());



        //                foreach (DataRow drw in dsDiferencias.Tables[STR_EmpleadoObraItemInfo].Rows)
        //                {
        //                    if (drw.RowState == DataRowState.Modified)
        //                    {
                                

        //                        EmpleadoObra erol = _db.EmpleadoObras.Single(p => p.idInternal == drw.Field<int>("idInternal"));
        //                        erol.Update(_db,
        //                             drw.Field<int>("idRol")
        //                           );
        //                        _db.SubmitChanges();
        //                    }

        //                    if (drw.RowState == DataRowState.Deleted)
        //                    {
        //                        drw.RejectChanges();

        //                        EmpleadoObra erol = _db.EmpleadoObras.Single(p => p.idInternal == drw.Field<int>("idInternal"));
        //                        _db.EmpleadoObras.DeleteOnSubmit(erol);
        //                        _db.SubmitChanges();
        //                    }

        //                    if (drw.RowState == DataRowState.Added)
        //                    {

        //                        EmpleadoObra empObra = new EmpleadoObra();
        //                        empObra.add(_db,
        //                            emp.idInternal,
        //                            drw.Field<int>("idObra"),
        //                            drw.Field<int>("idRol")
        //                            );
                                
                                
        //                    }

        //                }

        //                //venta


        //                foreach (DataRow drw in dsDiferencias.Tables[STR_EmpleadoProyInfo].Rows)
        //                {
        //                    if (drw.RowState == DataRowState.Modified)
        //                    {


        //                        EmpleadoProy erol = _db.EmpleadoProys.Single(p => p.idInternal == drw.Field<int>("idInternal"));
        //                        erol.SetUpdate(_db,
        //                             drw.Field<int>("idRol")
        //                           );
        //                        _db.SubmitChanges();
        //                    }

        //                    if (drw.RowState == DataRowState.Deleted)
        //                    {
        //                        drw.RejectChanges();

        //                        EmpleadoProy erol = _db.EmpleadoProys.Single(p => p.idInternal == drw.Field<int>("idInternal"));
        //                        _db.EmpleadoProys.DeleteOnSubmit(erol);
        //                        _db.SubmitChanges();
        //                    }

        //                    if (drw.RowState == DataRowState.Added)
        //                    {
        //                        EmpleadoProy empObra = new EmpleadoProy();
        //                            empObra.SetAdd(_db,
        //                                    emp.idInternal,
        //                                    drw.Field<int>("idRol"),
        //                                    drw.Field<int>("idProyecto")                                    
        //                                    );
        //                            _db.SubmitChanges();

        //                    }

        //                }

        //            }
                
        //            ts.Complete();
        //            bool result = true;
        //            return result;
        //        }
        //    }


        public void updateAcceso(dbGestionDataContext _db,
                                int idEmpleado,
                                int bitAdmin,
                                int bitModuloAlmacen,
                                int bitModuloCompra,
                                int bitModuloVenta,
                                int bitAprobarOC,
                                int montoAprobraOC)
        {



        }


        /// <summary>
        /// registro del Empleado en el gespag
        /// tipoAnexo es  realizado en el E
        
        /// </summary>
        /// <param name="_dbGestion"></param>
        /// <param name="idProveedor"></param>
        /// <param name="tipoProveedor"></param>
        public void UpdateGesPag(dbGestionDataContext _dbGestion, int idEmpleado)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //busca si no existe ya el proveedor
                Empleado empleado = _dbGestion.Empleados.Single(p => p.idInternal == idEmpleado);

                dbGespagDataContext _dbgesPag = new dbGespagDataContext(Parametros.dbGesPag);

                dbConCarDataContext _db = new dbConCarDataContext(Parametros.dbConCar);


                char tipoAnexo = 'T';

                //------------------------------CONCAR---------------------

                CT0001ANEX ct0001anex = _db.CT0001ANEXes.SingleOrDefault(p => (p.AVANEXO == tipoAnexo)
                                                        & p.ACODANE.Trim() == empleado.dni.Trim());

                if (ct0001anex != null)
                {
                    ct0001anex.SetUpdate(tipoAnexo, 
                                           'V',
                                           empleado.descripcion,
                                           empleado.direccion == null ? "" : empleado.direccion,
                                           empleado.apePaterno,
                                           empleado.apeMaterno,
                                           empleado.nombre,
                                           empleado.telefono,
                                           empleado.email,
                                           ""
                                        );
                    _db.SubmitChanges();
                }
                else
                {

                    ct0001anex = new CT0001ANEX();
                    ct0001anex.SetAdd(_db, 
                                    tipoAnexo,
                                    empleado.dni.Trim(),
                                    'V',
                                    empleado.descripcion,
                                    empleado.direccion == null ? "" : empleado.direccion,
                                     empleado.dni.Trim(),
                                    empleado.apePaterno,
                                    empleado.apeMaterno,
                                    empleado.nombre,
                                    empleado.telefono,
                                   'N',
                                    empleado.email,
                                    "",
                                    "");
                    _db.CT0001ANEXes.InsertOnSubmit(ct0001anex);
                    _db.SubmitChanges();
                }
                //---------------------------------------------------------
                //tablas de respaldo  GESPAG

                CON0002ANE9 cuentaGespaq = new CON0002ANE9();


                DAL.ProveedorCuenta proveedorCuenta = new DAL.ProveedorCuenta();
                //siempre debe existir uno  GESTION

                cuentaGespaq.SetAdd(_dbgesPag,
                                    empleado.dni.Trim(),
                                    tipoAnexo,
                                    "",
                                    'V',
                                    "N",
                                    empleado.descripcion,
                                    "",
                                    empleado.apePaterno,
                                    empleado.apeMaterno,
                                    empleado.nombre,
                                    empleado.dni,
                                    empleado.direccion==null?"":empleado.direccion,
                                    "",
                                    empleado.telefono,
                                    "",
                                    "",
                                    empleado.email,
                                    "",
                                    "AA",
                                    "01",
                                    "C1",
                                    "", //contacto
                                    "",
                                    0, //importe a rendir
                                    "", //importeMoneda
                                    proveedorCuenta.teleCuentaSOL.IsNull() ? "" : proveedorCuenta.teleCuentaSOL,
                                    proveedorCuenta.teleCuentaDOL.IsNull() ? "" : proveedorCuenta.teleCuentaDOL,
                                    proveedorCuenta.teleTipoProducto.IsNull() ? "" : proveedorCuenta.teleTipoProducto,
                                    proveedorCuenta.teleTipoDoc.IsNull() ? "" :proveedorCuenta.teleTipoDoc,
                                    proveedorCuenta.teleDocumento.IsNull() ? "" : proveedorCuenta.teleDocumento,
                                    proveedorCuenta.IntcuentaSOL.IsNull() ? "" : proveedorCuenta.IntcuentaSOL,
                                    proveedorCuenta.intcuentaDOL.IsNull() ? "" :proveedorCuenta.intcuentaDOL ,
                                    proveedorCuenta.intTipoProducto.IsNull() ? "" :proveedorCuenta.intTipoProducto ,
                                    proveedorCuenta.intTipoBono.IsNull() ? "" :proveedorCuenta.intTipoBono ,
                                    proveedorCuenta.intOficina.IsNull() ? "" :proveedorCuenta.intOficina ,
                                    proveedorCuenta.nacionDetraccion.IsNull() ? "" :proveedorCuenta.nacionDetraccion ,
                                    proveedorCuenta.nacionInterBan.IsNull() ? "" : proveedorCuenta.nacionInterBan,
                                    proveedorCuenta.continentCuentaSOL.IsNull() ? "" :proveedorCuenta.continentCuentaSOL ,
                                    proveedorCuenta.continentCuentaDOL.IsNull() ? "" : proveedorCuenta.continentCuentaDOL,
                                    proveedorCuenta.continentInterBan.IsNull() ? "" : proveedorCuenta.continentInterBan,
                                    proveedorCuenta.continentFormaPago.IsNull() ? "" : proveedorCuenta.continentFormaPago,
                                    proveedorCuenta.continentTipoCuenta.IsNull() ? "" :proveedorCuenta.continentTipoCuenta ,
                                    "", //detraccion
                                    "",  //retencion
                                     proveedorCuenta.scotiaCuentaSOL.IsNull() ? "" : proveedorCuenta.scotiaCuentaSOL,
                                    proveedorCuenta.scotiaCuentaDOL.IsNull() ? "" :proveedorCuenta.scotiaCuentaDOL ,
                                    proveedorCuenta.scotiaInterBan.IsNull() ? "" :proveedorCuenta.scotiaInterBan ,
                                    proveedorCuenta.scotiaFormaPago.IsNull() ? "" : proveedorCuenta.scotiaFormaPago);


                _dbgesPag.SubmitChanges();

                //luego actualizo el principal


                CON0001PRO1 cuentaprovee = _dbgesPag.CON0001PRO1s.SingleOrDefault(p => (p.PR1_CTGTPRO == tipoAnexo)
                                                      & p.PR1_CCODPRO.Trim() == empleado.dni.Trim());
                if (cuentaprovee != null)
                {

                    cuentaprovee.SetUpdate(tipoAnexo,
                                         'V',
                                            empleado.descripcion,
                                            empleado.apePaterno,
                                            empleado.apeMaterno,
                                            empleado.nombre,
                                            empleado.descripcion,
                                            empleado.direccion,
                                            "",
                                            empleado.telefono,
                                            "",
                                            empleado.email,
                                            "", //web
                                            "AA",    //acreedor
                                              "01",
                                             "C1",     //forma de pago
                                            "",
                                            "",
                                            "",
                                            0,
                                            proveedorCuenta.teleCuentaSOL.IsNull() ? "" : proveedorCuenta.teleCuentaSOL,
                                            proveedorCuenta.teleCuentaDOL.IsNull() ? "" : proveedorCuenta.teleCuentaDOL,
                                            proveedorCuenta.teleTipoProducto.IsNull() ? "" :proveedorCuenta.teleTipoProducto,
                                            proveedorCuenta.teleTipoDoc.IsNull() ? "" :proveedorCuenta.teleTipoDoc,
                                            proveedorCuenta.teleDocumento.IsNull() ? "" :proveedorCuenta.teleDocumento,
                                            proveedorCuenta.teleInterBan.IsNull() ? "" :proveedorCuenta.teleInterBan,
                                            proveedorCuenta.IntcuentaSOL.IsNull() ? "" :proveedorCuenta.IntcuentaSOL,
                                            proveedorCuenta.intcuentaDOL.IsNull() ? "" :proveedorCuenta.intcuentaDOL,
                                            proveedorCuenta.intTipoProducto.IsNull() ? "" :proveedorCuenta.intTipoProducto,
                                            proveedorCuenta.intTipoBono.IsNull() ? "" :proveedorCuenta.intTipoBono,
                                            proveedorCuenta.intOficina.IsNull() ? "" :proveedorCuenta.intOficina,
                                            proveedorCuenta.intInterBan.IsNull() ? "" :proveedorCuenta.intInterBan,
                                            proveedorCuenta.intTipoDocumento.IsNull() ? "" :proveedorCuenta.intTipoDocumento,
                                            proveedorCuenta.intNroDocumento.IsNull() ? "" :proveedorCuenta.intNroDocumento,
                                            proveedorCuenta.nacionDetraccion.IsNull() ? "" :proveedorCuenta.nacionDetraccion,
                                            proveedorCuenta.nacionInterBan.IsNull() ? "" : proveedorCuenta.nacionInterBan,
                                            0,
                                            "",
                                            proveedorCuenta.continentCuentaSOL.IsNull() ? "" :proveedorCuenta.continentCuentaSOL,
                                            proveedorCuenta.continentCuentaDOL.IsNull() ? "" :proveedorCuenta.continentCuentaDOL,
                                            proveedorCuenta.continentFormaPago.IsNull() ? "" :proveedorCuenta.continentFormaPago,
                                            proveedorCuenta.continentTipoCuenta.IsNull() ? "" :proveedorCuenta.continentTipoCuenta,
                                            proveedorCuenta.continentInterBan.IsNull() ? "" :proveedorCuenta.continentInterBan,
                                            proveedorCuenta.continenttipoDoc,
                                            proveedorCuenta.continentNroDoc.IsNull() ? "" : proveedorCuenta.continentNroDoc,
                                            "",
                                            "",
                                            proveedorCuenta.scotiaCuentaSOL.IsNull() ? "" : proveedorCuenta.scotiaCuentaSOL,
                                            proveedorCuenta.scotiaCuentaDOL.IsNull() ? "" :proveedorCuenta.scotiaCuentaDOL ,
                                            proveedorCuenta.scotiaInterBan.IsNull() ? "" :proveedorCuenta.scotiaInterBan ,
                                            proveedorCuenta.scotiaFormaPago.IsNull() ? "" : proveedorCuenta.scotiaFormaPago ,
                                            "SIST"
                                            );


                    _dbgesPag.SubmitChanges();
                }
                else
                {

                    cuentaprovee = new CON0001PRO1();
                    cuentaprovee.SetAdd(_dbgesPag, tipoAnexo,
                                         empleado.dni,
                                         'V',
                                         "N",
                                         "1", //DNI
                                         empleado.dni,
                                         empleado.descripcion,
                                         empleado.apePaterno,
                                         empleado.apeMaterno,
                                         empleado.nombre,
                                         empleado.descripcion,
                                         empleado.direccion,
                                         "",  //ubigeo
                                         empleado.telefono,
                                         empleado.telefono,
                                         empleado.email,
                                         "",
                                         "AA",    //acreedor
                                         "01",      //giro
                                         "C1",     //forma de pago
                                         "", //contacto,
                                         "" , //clasificacion,
                                         "",  //importeMoneda,
                                         0,
                                         proveedorCuenta.teleCuentaSOL,
                                         proveedorCuenta.teleCuentaDOL,
                                         proveedorCuenta.teleTipoProducto,
                                         proveedorCuenta.teleTipoDoc,
                                         proveedorCuenta.teleDocumento,
                                         proveedorCuenta.teleInterBan,
                                         proveedorCuenta.IntcuentaSOL,
                                         proveedorCuenta.intcuentaDOL,
                                         proveedorCuenta.intTipoProducto,
                                         proveedorCuenta.intTipoBono,
                                         proveedorCuenta.intOficina,
                                         proveedorCuenta.intInterBan,
                                         proveedorCuenta.intTipoDocumento,
                                         proveedorCuenta.intNroDocumento,
                                         proveedorCuenta.nacionDetraccion,
                                         proveedorCuenta.nacionInterBan,
                                         0,
                                         "",
                                         proveedorCuenta.continentCuentaSOL,
                                         proveedorCuenta.continentCuentaDOL,
                                         proveedorCuenta.continentFormaPago,
                                         proveedorCuenta.continentTipoCuenta,
                                         proveedorCuenta.continentInterBan,
                                         proveedorCuenta.continenttipoDoc,
                                         proveedorCuenta.continentNroDoc,
                                         "", //detraccion,
                                         "", //retencion,
                                         proveedorCuenta.scotiaCuentaSOL,
                                         proveedorCuenta.scotiaCuentaDOL,
                                         proveedorCuenta.scotiaInterBan,
                                         proveedorCuenta.scotiaFormaPago,
                                         "SIST"
                                         );
                    _dbgesPag.SubmitChanges();
                }


                ts.Complete();
            }

        }
        

        public bool deleteObraAsignada(int idObraAsiganda)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                bool result = false;
                using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
                {
                    EmpleadoObra eo = _db.EmpleadoObras.Single(p => p.idInternal == idObraAsiganda);
                    _db.EmpleadoObras.DeleteOnSubmit(eo);
                    _db.SubmitChanges();
                    result = true;
                }
                ts.Complete();
                return result;
            }
            
        }
        //public bool deleteRolAsignada(int idRolAsignada)
        //{
        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        bool result = false;
        //        using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
        //        {
        //            EmpleadoRol eo = _db.EmpleadoRol.Single(p => p.idInternal == idRolAsignada);
        //            _db.EmpleadoRol.DeleteOnSubmit(eo);
        //            _db.SubmitChanges();
        //            result = true;
        //        }
        //        ts.Complete();
        //        return result;
        //    }

        //}


        //public bool AddObraAsignada(int idEmpleado, int idObra, int idRol, int nivelAprob)
        //{
        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        bool result = false;
                

        //        using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
        //        {

        //            var q = from a in _db.EmpleadoObra
        //                    where a.idEmpleado == idEmpleado
        //                    select a;

        //            List<EmpleadoObra> list = q.ToList();

        //            if (list.Where(p => p.idObra == idObra).Count() > 0)
        //            {
        //                throw new Exception(" No Puede ingresar Obra ya existente");
        //            }

        //            EmpleadoObra eo = new EmpleadoObra();
        //            eo.add(_db, idEmpleado, idObra,idRol,nivelAprob);
                    
        //            result = true;
        //        }
        //        ts.Complete();
        //        return result;
        //    }

        //}
        //public bool AddRolAsignada(int idEmpleado, int idRol)
        //{
        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        bool result = false;


        //        using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
        //        {

        //            var q = from a in _db.EmpleadoRol
        //                    where a.idEmpleado == idEmpleado
        //                    select a;

        //            List<EmpleadoRol> list = q.ToList();

        //            if (list.Where(p => p.idRol== idRol).Count() > 0)
        //            {
        //                throw new Exception(" No Puede ingresar Obra ya existente");
        //            }

        //            EmpleadoRol eo = new EmpleadoRol();
        //            eo.add(_db, idEmpleado, idRol);

        //            result = true;
        //        }
        //        ts.Complete();
        //        return result;
        //    }

        //}
        
        public bool delete(dbGestionDataContext _db,int idEmpleado)
        {

            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {



                var empleado = _db.Empleados.SingleOrDefault(o => o.idInternal == idEmpleado);



                _db.EmpleadoObras.DeleteAllOnSubmit(empleado.EmpleadoObras);
                _db.EmpleadoProys.DeleteAllOnSubmit(empleado.EmpleadoProys);
                _db.Empleados.DeleteOnSubmit(empleado);

                _db.SubmitChanges();
                ts.Complete();
                result = true;
            }
            return result;

        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public EmpleadoInfo load(int idEmpleado)
        {

            using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
            {
              

                return (from a in _db.Empleados
                        where a.idInternal==idEmpleado
                        select new EmpleadoInfo
                        {
                            idInternal=a.idInternal,
                            descripcion=a.descripcion,
                            nombre=a.nombre,
                            atte=a.atte,
                            apePaterno=a.apePaterno,
                            apeMaterno=a.apeMaterno,
                            dni=a.dni,
                            usuario=a.usuario,
                            telefono=a.telefono,
                            fax=a.fax,
                            email=a.email,
                            inActivo=a.inActivo.Value,
                            tieneAcceso=a.tieneAcceso.Value,
                            firma=a.firma,
                        }).First();


            }

        }

         [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<EmpleadoObraItemInfo> getEmpleadoObra(int idEmpleado)
        {
          
                EmpleadoObraItemInfo add = new EmpleadoObraItemInfo();
                add.idInternal=0;
                add.idObra = 0;

                List<EmpleadoObraItemInfo> lista = new List<EmpleadoObraItemInfo>();

                lista = (from a in DbUtil.Db.EmpleadoObras
                         where a.idEmpleado == idEmpleado
                         select new EmpleadoObraItemInfo
                         {
                             idEmpleado=a.idEmpleado,
                             idInternal=a.idInternal,
                             idObra=a.idObra,
                             idRol=a.idRol.Value,
                             obraStr=a.Obra.descripcion,
                             rolstr=a.Rol.descripcion
                         }).ToList();
               
                //if (lista.Count() == 0)
                //{
                //    lista.Add(add);
                //}

                return lista;

        }

         [DataObjectMethod(DataObjectMethodType.Select, false)]
         public IEnumerable<EmpleadoProyInfo> getEmpleadoProy(int idEmpleado)
         {


             var q= from a in DbUtil.Db.EmpleadoProys
                      where a.idEmpleado == idEmpleado
                    select new EmpleadoProyInfo
                      {
                          idInternal = a.idinternal,
                          idProyecto = a.idProyecto,
                          idRol = a.idRol,
                          proyectoStr = a.Proyecto.descripcion,
                          rolStr = a.Rol.descripcion
                      };

             
             return q.ToList();

         }


        // [DataObjectMethod(DataObjectMethodType.Select, false)]
        // public List<ListValueInfo> getEmpleadoRol(int idEmpleado)
        //{
        //    using (dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString))
        //    {
        //        view_EmpleadoRol add = new view_EmpleadoRol();
        //        add.idInternal = 0;
        //        add.idRol = 0;

        //        List<ListValueInfo> lista = new List<ListValueInfo>();


        //        lista = (from a in _db.view_EmpleadoObra
        //                 where a.idEmpleado == idEmpleado
        //                 select new ListValueInfo
        //     {
        //         idInternal=a.idRol.Value,
        //         descripcion=a.descripcionRol
        //     }).Distinct().ToList();

        //        //if (lista.Count() == 0)
        //        //{
        //        //    lista.Add(add);
        //        //}

        //        return lista;


        //    }
        //}
        
        [DataObjectMethod(DataObjectMethodType.Select, false)]
         public string getEmpleadoAll(string prefixText, int count)
         {

             var p = (from a in DbUtil.Db.Empleados
                      where a.descripcion.Contains(prefixText)
                      select new ListValueInfo
                      {
                          idInternal = a.idInternal,
                          descripcion = a.descripcion,

                      }).Take(20);

             return Util.Tbl2Str(Util.EntidadToDataTable(p));

            
         }


        int _count;
        public int Count(string descripcion, bool bitVerActivo, int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }
        public int Count(int idRol, int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }
        public int Count( int startRowIndex, int maximumRows, string sortExpression,int idObra)
        {
            return _count;
        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<EmpleadoListInfo> GetEmpleadoListToObra( int startRowIndex, int maximumRows, string sortExpression,int idObra)
        {

            var empleados = (from a in DbUtil.Db.EmpleadoObras
                             where a.idObra== idObra
                             select a.idEmpleado).Distinct();

            var q = ApplySelect_EmpleadoListInfo();
            q = q.Where(
                a => empleados.Contains(a.idInternal) &
                    a.tieneAcceso == true);



            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();

        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<EmpleadoListInfo> GetEmpleadoListToRol(int idRol, int startRowIndex, int maximumRows, string sortExpression)
        {
            
            var empleados= (from  a  in DbUtil.Db.EmpleadoObras
                   where a.idRol==idRol
                   select a.idEmpleado).Distinct();

            var q = ApplySelect_EmpleadoListInfo();
            q = q.Where(
                a => empleados.Contains(a.idInternal) &
                    a.tieneAcceso==true);
                    


            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();

        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public IEnumerable<EmpleadoListInfo> GetEmpleadoList(string descripcion, bool bitVerActivo, int startRowIndex, int maximumRows, string sortExpression)
        {
            if (!descripcion.HasValue())
                descripcion = "";


            var q = ApplySelect_EmpleadoListInfo();
            q = q.Where(
                a => a.descripcion.Contains(descripcion) &
                    (a.bitActivo == !bitVerActivo )
                );



            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();

        }

        private IQueryable<EmpleadoListInfo> ApplySelect_EmpleadoListInfo()
        {
            var q = from a in DbUtil.Db.Empleados
                    select new EmpleadoListInfo
                    {
                        descripcion=a.descripcion,
                        dni=a.dni,
                        email=a.email,
                        idInternal=a.idInternal,
                        telefono=a.telefono,
                        tieneAcceso=a.tieneAcceso.Value,
                        usuario=a.usuario,
                        bitActivo=!a.inActivo.Value,


                    };
            return q;
        }

       


        private IQueryable<EmpleadoListInfo> ApplySort(IQueryable<EmpleadoListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcion DESC":
                    q = q.OrderByDescending(b => b.descripcion);
                    break;
                case "dni":
                    q = q.OrderBy(b => b.dni);
                    break;
                case "dni DESC":
                    q = q.OrderByDescending(b => b.dni);
                    break;
                case "email":
                    q = q.OrderBy(b => b.email);
                    break;
                case "email DESC":
                    q = q.OrderByDescending(b => b.email);
                    break;

                case "telefono":
                    q = q.OrderBy(b => b.telefono);
                    break;
                case "telefono DESC":
                    q = q.OrderByDescending(b => b.telefono);
                    break;


                case "tieneAcceso":
                    q = q.OrderBy(b => b.tieneAcceso);
                    break;
                case "tieneAcceso DESC":
                    q = q.OrderByDescending(b => b.tieneAcceso);
                    break;


                case "usuario":
                    q = q.OrderBy(b => b.usuario);
                    break;
                case "usuario DESC":
                    q = q.OrderByDescending(b => b.usuario);
                    break;
                
                default:
                    q = q.OrderByDescending(b => b.idInternal);
                    break;
            }
            return q;
        }



        public IQueryable<int> GetProyectosAcceso()
        {
            int? i = (int?)System.Web.HttpContext.Current.Session["idEmpleado"];
            if (i == null)
                return null;

            int idEmpleado = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

            //caso de ventas
            var proyecto = from x in DbUtil.Db.EmpleadoProys
                           where x.idEmpleado == idEmpleado
                           select x.idProyecto;

            return proyecto;
        }

        public IQueryable<int> GetObraAcceso()
        {
            int? i = (int?)System.Web.HttpContext.Current.Session["idEmpleado"];
            if (i == null)
                return null;

            int idEmpleado = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

            //caso de compras
            var obra = from x in DbUtil.Db.EmpleadoObras
                           where x.idEmpleado == idEmpleado
                           select x.idObra;

            return obra;
        }


    }

    



}
